package testslideswitch.testhttpclient;

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;

import org.json.JSONException;

import java.io.File;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.concurrent.TimeoutException;

/**
 * 系统业务逻辑.
 *
 * @author paladin
 * @Description
 * @date 2014年10月22日
 * @Copyright: Copyright (c) 2014 Shenzhen Tentinet Technology Co., Ltd. All
 * rights reserved.
 */
public class SystemBiz {

    /**
     * 生成Post请求默认参数.
     *
     * @return 返回包含默认参数map.
     * @version 1.0
     * @createTime 2014年10月22日, 下午2:10:57
     * @updateTime 2014年10月22日, 下午2:10:57
     * @createAuthor paladin
     * @updateAuthor paladin
     * @updateInfo
     */
    public static HashMap<String, String> getPostRequestHead(String method) {
        HashMap<String, String> map = new HashMap<String, String>();
//        map.put("method", method);
//        map.put("v", "0.1");
//        map.put("app_key", "10");
        return map;
    }

    /**
     * 发送Get请求.
     *
     * @param path 请求路径及参数.
     * @return 服务器响应数据.
     * @version 1.0
     * @createTime 2014年10月22日, 下午2:15:24
     * @updateTime 2014年10月22日, 下午2:15:24
     * @createAuthor paladin
     * @updateAuthor paladin
     * @updateInfo
     */
    public static ResponseBean sendGetRequest(String path) {
        ResponseBean bean = new ResponseBean();
        String result = null;
        try {
            NetUtil net = new NetUtil();
            if (!net.isNetworkAvailable(TApplication.context)) {
                bean.setStatus(ResponseBean.STATUS_NET_ERROR);
                bean.setInfo(TApplication.context.getString(R.string.no_net));
                return bean;
            }
            result = net.sendGet(path, TIMEOUT);
        } catch (SocketTimeoutException e) { // 读写超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        } catch (IOException e) { // 读写异常.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.data_error));
            return bean;
        } catch (TimeoutException e) { // 任务超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        }
        return resolvingResult(result);
    }


    /**
     * 发送post请求（无参数的指定地址）
     *
     * @param path 请求路径
     * @return
     * @version 1.0
     * @createTime 2015年6月19日, 下午3:22:39
     * @updateTime 2015年6月19日, 下午3:22:39
     * @createAuthor 王治粮
     * @updateAuthor 王治粮
     * @updateInfo
     */
    public static ResponseBean sendPostRequest(String path) {
        ResponseBean bean = new ResponseBean();
        String result = null;
        try {
            NetUtil net = new NetUtil();
            if (!net.isNetworkAvailable(TApplication.context)) {
                bean.setStatus(ResponseBean.STATUS_NET_ERROR);
                bean.setInfo(TApplication.context.getString(R.string.no_net));
                return bean;
            }
            result = net.sendPost(path, TIMEOUT);
            LogUtil.logDebugMessage("post==>>" + result);
        } catch (SocketTimeoutException e) { // 读写超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        } catch (IOException e) { // 读写异常.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.data_error));
            return bean;
        } catch (TimeoutException e) { // 任务超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        }
        return resolvingResult(result);
    }


    /**
     * 发送Post请求.
     *
     * @param path   Post请求路径.
     * @param params 传递参数.
     * @return 服务器响应数据.
     * @version 1.0
     * @createTime 2014年10月22日, 下午2:15:46
     * @updateTime 2014年10月22日, 下午2:15:46
     * @createAuthor paladin
     * @updateAuthor paladin
     * @updateInfo
     */
    public static ResponseBean sendPostRequest(String path, HashMap<String, String> params) {
        ResponseBean bean = new ResponseBean();
        String result = null;
        try {
            NetUtil net = new NetUtil();
            if (!net.isNetworkAvailable(TApplication.context)) {
                bean.setStatus(ResponseBean.STATUS_NET_ERROR);
                bean.setInfo(TApplication.context.getString(R.string.no_net));
                return bean;
            }
            result = net.sendPost(path, TIMEOUT, params);
            LogUtil.logDebugMessage("path==>>" + result);
        } catch (SocketTimeoutException e) { // 读写超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        } catch (IOException e) { // 读写异常.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.data_error));
            return bean;
        } catch (TimeoutException e) { // 任务超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        }
        return resolvingResult(result);
    }

    /**
     * 发送Post请求.
     *
     * @param params 传递参数.
     * @return 服务器响应数据.
     * @version 1.0
     * @createTime 2014年10月22日, 下午2:15:46
     * @updateTime 2014年10月22日, 下午2:15:46
     * @createAuthor paladin
     * @updateAuthor paladin
     * @updateInfo
     */
    public static ResponseBean sendPostRequest(HashMap<String, String> params) {
        ResponseBean bean = new ResponseBean();
        String result = null;
        try {
            NetUtil net = new NetUtil();
            if (!net.isNetworkAvailable(TApplication.context)) {
                bean.setStatus(ResponseBean.STATUS_NET_ERROR);
                bean.setInfo(TApplication.context.getString(R.string.no_net));
                return bean;
            }
            result = net.sendPost(TApplication.SERVER_API, TIMEOUT, params);
        } catch (SocketTimeoutException e) { // 读写超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        } catch (IOException e) { // 读写异常.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.data_error));
            return bean;
        } catch (TimeoutException e) { // 任务超时.
            e.printStackTrace();
            bean.setStatus(ResponseBean.STATUS_NET_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.connect_error));
            return bean;
        }
        return resolvingResult(result);
    }


    /**
     * 上传文件.
     *
     * @param params 参数.
     * @param files  文件.
     * @return
     * @version 1.0
     * @createTime 2014年10月31日, 下午6:47:11
     * @updateTime 2014年10月31日, 下午6:47:11
     * @createAuthor paladin
     * @updateAuthor paladin
     * @updateInfo
     */
    public static ResponseBean uploadFile(HashMap<String, String> params, HashMap<String, File> files) {
        String result = new NetUtil().sendMultyPartRequest("http://192.168.1.74/fileServer/uploadFile.do", params, files);
        ResponseBean responseBean = null;
        // 去除
        // BOM头{fileData=/storage/sdcard0/Jimei_Pabulum/Image/Screenshot_2015-05-28-16-25-03.png}
        if (result != null && result.startsWith("\ufeff")) {
            result = result.substring(1);
        }
        // 10000:/upload/20150509/b9e8f41da0fe4280ae2465e5f7369f6b.jpg:115682
          String[] results = result.split(":");
        if (results != null && !results.equals("[]")) {
            LogUtil.logDebugMessage("uploadFile==>>" + result);
            // 返回状态为 10000 就是请求上传成功
            responseBean = new ResponseBean();
            if (!TextUtils.isEmpty(results[0])) {
                LogUtil.logDebugMessage("uploadFile=results=>>"+results[0]);
                responseBean.setStatus(Integer.valueOf(results[0]));
                responseBean.setInfo(results[2]);
                responseBean.setData(results[1]);
            }
        }
        return responseBean;
    }


    /**
     * 解析响应信息.
     *
     * @param result 响应信息.
     * @return 返回解析的响应信息.
     * @version 1.0
     * @createTime 2014年10月23日, 上午10:08:01
     * @updateTime 2014年10月23日, 上午10:08:01
     * @createAuthor paladin
     * @updateAuthor paladin
     * @updateInfo
     */
    public static ResponseBean resolvingResult(String result) {
        ResponseBean bean = new ResponseBean();
        if ("error".equals(result)) { // 请求返回不成功.
            bean.setStatus(ResponseBean.STATUS_SERVER_ERROR);
            bean.setInfo(TApplication.context.getString(R.string.data_error));
        } else {
            try {
                HashMap<String, String> response = new JsonUtil().resolvingJsonObject(result);
                bean.setStatus(Integer.valueOf(StringUtil.getParamsForNumber(response.get("status"), "10000")));
                bean.setInfo(response.get("info"));
                bean.setData(response.get("data"));
            } catch (JSONException e) {
                bean.setStatus(ResponseBean.STATUS_SERVER_ERROR);
                bean.setInfo(TApplication.context.getString(R.string.data_error));
                e.printStackTrace();
            }
        }
        return bean;
    }


    /**
     * 传递参数
     *
     * @param map   键值对对象
     * @param key   键
     * @param value 值
     * @version 1.0
     * @createTime 2013-11-8,下午2:10:30
     * @updateTime 2013-11-8,下午2:10:30
     * @createAuthor CodeApe
     * @updateAuthor CodeApe
     * @updateInfo (此处输入修改内容, 若无修改可不写.)
     */
    public static void MapPutValue(HashMap<String, String> map, String key, String value) {
        if (!TextUtils.isEmpty(value)) {
            map.put(key, value);
        }
    }

    /**
     * 获取本机的物理地址
     *
     * @param context 上下文对象
     * @return
     * @version 1.0
     * @createTime 2014年12月10日, 下午3:49:22
     * @updateTime 2014年12月10日, 下午3:49:22
     * @createAuthor 王治粮
     * @updateAuthor 王治粮
     * @updateInfo
     */
    public static String getLocalMacAddress(Context context) {
        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo info = wifi.getConnectionInfo();
        return info.getMacAddress();
    }

    /**
     * 超时时间
     */
    private static final int TIMEOUT = 10000;

}
